package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.ClazzMapper;
import com.itheima.mapper.StudentMapper;
import com.itheima.pojo.Clazz;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageResult;
import com.itheima.pojo.Student;
import com.itheima.service.ClazzService;
import com.itheima.service.EmpService;
import com.itheima.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {

    @Autowired
    private EmpService empService;

    @Autowired
    private StudentMapper studentMapper;

    /**
     * 分页查询班级
     *
     * @param begin
     * @param end
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public PageResult<Clazz> getPageResult(String name, LocalDate begin, LocalDate end, int page, int pageSize) {

        //创建page对象
        Page<Clazz> pages = new Page<>(page, pageSize);

        //根据修改时间倒序排序查询
        pages.addOrder(OrderItem.desc("update_time"));

        pages = lambdaQuery().like(name != null && !name.isEmpty(), Clazz::getName, name)
                .between(begin != null && end != null, Clazz::getEndDate, begin, end)
                .page(pages);

        //获取班级的集合 .getRecords()是获取当前分页查询返回的数据记录列表的方法，返回的是一个List<T>类型的集合需要指定类型
        List<Clazz> clazzs = pages.getRecords();

        //获取班级集合中的班主任的姓名和结课状态，用集合收集
        List<Long> masterIds = clazzs.stream().map(clazz -> clazz.getMasterId()).collect(Collectors.toList());

        //判断masterIds是否为空，不为空才去查询班主任
        if (!masterIds.isEmpty()) {

            //调用service层方法，根据班主任的Id集合在员工表中批量查询，以获取对应的班主任名称（只查一次表）
            List<Emp> emps = empService.listByIds(masterIds);

            //创建一个实时时间的对象
            LocalDate now = LocalDate.now();

            //在内存中将班主任名称封装到班级对象中
            clazzs.forEach(clazz -> {

                //遍历员工集合，获取到当前班级的班主任名称
                emps.forEach(emp -> {
                    if (clazz.getMasterId() != null && clazz.getMasterId().equals(emp.getId())) {
                        clazz.setMasterName(emp.getName());
                    }
                });

                //进行比较
                if (now.isBefore(clazz.getBeginDate())) {
                    clazz.setStatus("未开课");
                } else if (now.isAfter(clazz.getEndDate())) {
                    clazz.setStatus("已结课");
                } else {
                    clazz.setStatus("在读");
                }
            });

        }

        //返回分页查询的数据
        return new PageResult<>(pages.getTotal(), pages.getRecords());

    }

    /**
     * 判断班级中是否还有学生
     *
     * @param id
     */
    @Override
    public void deleteById(Integer id) {

      /*
        //第二种方案：
        List<Student> clazzList = studentMapper.selectList(new LambdaQueryWrapper<Student>()
                    .eq(Student::getClazzId,id));

        if(!clazzList.isEmpty()){
            throw new SecurityException("该班级中还有学生，不能删除");
        }*/

        //创建LambdaQueryWrapper对象，统计该班级中的学生人数（推荐使用selectCount,当数据过多时，list会更耗费性能）
        //第一种方案：
        Long count = studentMapper.selectCount(new LambdaQueryWrapper<Student>()
                .eq(Student::getClazzId, id));

        //判断是否还有学生
        if (count > 0) {

            //还有学生抛出异常
            throw new SecurityException("该班级中还有学生，不能删除");
        }

        //没有学生，执行删除
        removeById(id);

    }


}
